package com.ato.IO;

import org.junit.Test;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

/**
 * @author wangjing
 * @create 2021--12--11--22:07
 * <p>
 * 输入          输入
 * 字符流：  16bit char  Reader       Writer        抽象类
 * 字节流：  8bit byte  InputStream  OutputStream   抽象类
 */
public class IOFileReaderTest {
    @Test
    public void test1() {
//        注意问题：@Test和main()   test是相较于module   main是相较于工程
        FileReader fr = null;
        try {
//        1：实例化File
            File file = new File("D:\\javacode\\01\\study-java\\renameTO.txt");
//        2：提供具体的流
            fr = new FileReader(file);
//          3:数据的操作，比如读
//                  read()  返回读取的一个字符，如果达到末尾，返回-1
            int read = fr.read();
            while (read != -1) {
//              注意：1:读取到的应该是编码，然后你要转成一个字符 char
//                   2：读一个以后，你还得让他继续读 其实就相当于i++  让他满足能终止，不然就是死循环
                System.out.print((char) read);
                read = fr.read();
            }
//        简写
//        int read1;
//        while ((read1 = fr.read()) != -1){
//            System.out.print((char) read1);
//        }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
//            4:必须关闭流，且关闭也会有异常
            try {
//                if是因为如果对象在实例化时就报错了，那么也要处理
                if (fr != null) fr.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    @Test
    public void testReader() {
        FileReader fr = null;
        try {
//        1：实例化File
            File file = new File("D:\\javacode\\01\\study-java\\renameTO.txt");
//        2：提供具体的流
            fr = new FileReader(file);

//             这里是字符流 就是char[]  如果是字节流 则是byte[]
            char[] cbuf = new char[5];
//        read(char[] cbuf) 这个就相当于  每一次读取时 读取几个字符
            int len;
            while ((len = fr.read(cbuf)) != -1) {
//                注意了：这里你每次读5个，比如读到最后还剩3个字符了，但是又读不到五个，那么 这个五个中 前三个会被替换成剩余的3个，而最后的会被当成新的
// 所有这里循环的 小于值应该是你每次读取的长度的值，
//                for (int i = 0; i < read; i++) {
//                    System.out.print(cbuf[i]);
//                }

//            方式2：String本身就是char[]的数组 所以直接构造函数放入就行
                String s = new String(cbuf, 0, len);
                System.out.print(s);

            }


        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //            4:必须关闭流，且关闭也会有异常
            try {
//                if是因为如果对象在实例化时就报错了，那么也要处理
                if (fr != null) fr.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }




}